package com.hspedu.com.jdbc.utils;

import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;

/**
 * @author DL5O
 * @version 1.0
 * 这是一个工具类，完成 mysql的连接和关闭资源
 */
public class JDBCUtils {
    //定义相关属性(几个)，因为只需要一份，因此做成static
    private static String user;//用户名
    private static String password;//密码
    private static String url;//连接数据库的地址 "jdbc:mysql://localhost:3306/ywl_db02"
    private static String driver;//驱动名 com.mysql.jdbc.driver

    //在static代码块中去初始化
    static {
        Properties properties = new Properties();
        try {
            properties.load(new FileInputStream("src\\jdbc.properties"));
            //读取相关的属性值
            user = properties.getProperty("user");
            password = properties.getProperty("password");
            url = properties.getProperty("url");
            driver = properties.getProperty("driver");

        } catch (IOException e) {
            //在实际开发中，我们可以这样处理
            //1.将编译异常转成运行异常
            //2.这时调用者，可以选择捕获该异常，也可以选择默认处理，比较方便
            throw new RuntimeException(e);
        }
    }

    //连接我们的数据库，返回Connection
    public static Connection getConnection() {
        try {
            Class.forName(driver);
            return DriverManager.getConnection(url, user, password);
        } catch (SQLException | ClassNotFoundException throwables) {
            throw new RuntimeException(throwables);//转成一个运行异常
        }
    }

    //关闭相关资源
    /*
        1.ResultSet 结果集
        2.Statement 或者 PreparedStatement
        3.Connection
        4.如果需要关闭资源，就传入对象，否则传入 null
     */
    public static void close(ResultSet set, Statement statement, Connection connection) {
        //判断是否为null
        try {
            if (set != null) {
                set.close();
            }

            if (statement != null) {
                statement.close();
            }

            if (connection != null) {
                connection.close();
            }
        }catch (SQLException throwables){
            //将编译异常转成运行异常抛出
            throw new RuntimeException(throwables);
        }
    }
}
